#include <memory>
#include <iostream>

using namespace std;

void process(shared_ptr<int>);

int main()
{
    shared_ptr<int> p(new int(42)); // 引用计数为 1
    process(p); // 拷贝 p 会递增它的引用计数；在 process 中引用计数值为 2
    cout << "p.use_count() = " << p.use_count() << endl;
    int i = *p; // 正确：引用计数值为 1
    cout << i << endl;

    int *x(new int(1024));          // 危险：x 是一个普通指针，不是一个智能指针
    // process(x); // 错误：不能将 int* 转换为一个 shared_ptr<int>
    process(shared_ptr<int>(x));    // 合法的，但内存会被释放！
    int j = *x; // 未定义的：x 是一个空悬指针！
    cout << j << endl;
}

// 在函数被调用时 ptr 被创建并初始化
void process(shared_ptr<int> ptr)
{
    // 使用 ptr
    cout << "ptr.use_count() = " << ptr.use_count() << endl;
} // ptr 离开作用域，被销毁